/**
 * 将对象数组中的某个属性重组为一个新的数组
 * @param {Array} arr 数组
 * @param {String} key
 * @param {Boolean} unique - 是否去重
 * @returns {Array}
 */
function selectProp(arr, key, unique = false) {
    if (typeof key !== 'string' || key.length === 0) {
        return [];
    }
    if (!unique) {
        const result = [];
        arr.forEach(function (item) {
            result.push(item[key]);
        });
        return result;
    } else {
        return selectPropUnique(arr, key);
    }
}

/**
 * 将对象数组中的某个属性重组为一个新的数组 并自动去重
 * @param {Array} arr 数组
 * @param {String} key
 * @returns {Array}
 */
function selectPropUnique(arr, key) {
    return Array.from(new Set(selectProp(arr, key)));
}

/**
 * 将对象数组中的某一列累加
 * @param {Array} arr 数组
 * @param {String} key - 属性名。如果不指定，则视为累加整个数组
 * @param {Number} bei - 系数，用于提高精度
 * @returns {Number}
 */
function selectSum(arr, key, bei = 1) {
    let total = 0;
    if (typeof (key) === 'string' && key.length > 0) {
        arr.forEach(function (item) {
            total += item[key] * bei;
        });
    } else {
        arr.forEach(function (item) {
            total += item * bei;
        });
    }
    return total / bei;
}

/**
 * 获取数组中最小的元素
 * @param arr
 * @returns {*}
 */
function selectMin(arr) {
    let result = arr[0];
    arr.forEach(item => {
        if (item < result)
            result = item;
    });
    return result;
}

/**
 * 获取数组中最大的元素
 * @param arr
 * @returns {*}
 */
function selectMax(arr) {
    let result = arr[0];
    arr.forEach(item => {
        if (item > result)
            result = item;
    });
    return result;
}

export {
    selectProp,
    selectPropUnique,
    selectSum,
    selectMin,
    selectMax,
}
